package com.bawei.lib_log.file

import android.content.Context
import java.io.File
import java.io.FileOutputStream
import java.io.IOException
import java.text.SimpleDateFormat
import java.util.*

class FileManager(private val context: Context) {
    // 配置常量
    companion object {
        const val MAX_FILE_COUNT = 10
        const val MAX_FILE_SIZE_MB = 10 // 10MB
        private const val FILE_PREFIX = "log_"
        private const val FILE_EXTENSION = ".dat"
    }

    /**
     * 写入数据到新文件（自动维护文件限制）
     * @param data 要写入的字节数据
     * @return 成功写入的文件路径，失败返回null
     */
    fun writeDataWithLimits(data: ByteArray): String? {
        return try {
            // 1. 检查并清理旧文件
            enforceFileLimits()

            // 2. 创建时间戳文件名
            val fileName = generateTimeBasedFileName()
            val file = File(getStorageDir(), fileName)

            // 3. 检查单文件大小限制
            if (data.size > MAX_FILE_SIZE_MB * 1024 * 1024) {
                // 超限写入前10MB
                FileOutputStream(file).use { fos ->
                    fos.write(data, 0, MAX_FILE_SIZE_MB * 1024 * 1024)
                }
            } else {
                // 正常写入
                FileOutputStream(file).use { fos ->
                    fos.write(data)
                }
            }
            file.absolutePath
        } catch (e: IOException) {
            e.printStackTrace()
            null
        }
    }

    /**
     * 生成基于时间的文件名
     */
    private fun generateTimeBasedFileName(): String {
        val timeStamp = SimpleDateFormat("yyyyMMdd_HHmmssSSS", Locale.getDefault()).format(Date())
        return "$FILE_PREFIX$timeStamp$FILE_EXTENSION"
    }

    /**
     * 获取存储目录（优先外部存储）
     */
    private fun getStorageDir(): File {
        val dir = context.getExternalFilesDir(null) ?: context.filesDir
        dir.mkdirs()
        return dir
    }

    /**
     * 强制执行文件数量限制
     */
    private fun enforceFileLimits() {
        val dir = getStorageDir()
        val files = dir.listFiles { file ->
            file.name.startsWith(FILE_PREFIX) && file.name.endsWith(FILE_EXTENSION)
        }?.sortedBy { it.lastModified() } ?: return

        // 删除最旧的文件直到满足数量限制
        while (files.size >= MAX_FILE_COUNT) {
            files.firstOrNull()?.delete()
            files.toMutableList().removeFirst()
        }
    }

    /**
     * 获取当前文件状态
     */
    fun getFileStatus(): List<Pair<String, String>> {
        return getStorageDir().listFiles { file ->
            file.name.startsWith(FILE_PREFIX) && file.name.endsWith(FILE_EXTENSION)
        }?.map {
            Pair(it.name, "${it.length() / 1024}KB")
        } ?: emptyList()
    }
}